package javaNIO1.channel;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

/**
 * Created with Intel IDEA.
 * DatagramChannel  面向包的并且是无连接的协议 即Udp/ip(可能会出现 包的丢失或乱序，重复)
 * @Auther: gjt
 * @Date: 2024/7/21 10:13
 */
public class datagramChannel {
    public static void main(String[] args) {
        /**
         * datagramChannel 既可以充当服务器（监听者）也可以充当客户端（发送者）：是无连接的
         *
         */
        try (DatagramChannel datagramChannel = DatagramChannel.open()){
            // 注意是绑定 不是连接
            datagramChannel.bind(new InetSocketAddress(13));

            // 接收数据: 如果通道是阻塞模式，可能无限的休眠直到有包到达，如果是非阻塞模式，没有包时返回null；
            // 如果包内的数据超出了缓冲区，则会截断，后边的数据会丢弃
            datagramChannel.receive(ByteBuffer.allocateDirect(1000));

            // 发送数据: 如果通道是阻塞模式，可能无限的休眠直到有包到达传输队列，如果是非阻塞模式，返回的是字节缓冲区的字节数或0 ；
            // 如果传输队列没有足够的空间承受数据报，则什么也不会发送；
            datagramChannel.send(ByteBuffer.allocateDirect(1000), new InetSocketAddress("127.0.0.1", 13));

            // 设置成已连接的通道：可以使除了它所连接到的地址以外的任何其他源地址的数据报被忽略：不想要的报在网络层已经被丢弃了
            // 发送数据将不在提供目标地址而且接收时的源地址是已知的 可以使用read/write 以及gather/scatter
            datagramChannel.connect(new InetSocketAddress("127.0.0.1", 13));


            /**
             * 如果当前通道是未连接状态进行读写 则会抛出NotYetConnectedException
             */
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
